package simple.string;

import java.util.*;

/**
 * <a href="https://leetcode-cn.com/problems/keyboard-row">500. 键盘行</a>
 * 给你一个字符串数组 words ，只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
 * 美式键盘 中：
 *   第一行由字符 "qwertyuiop" 组成。
 *   第二行由字符 "asdfghjkl" 组成。
 *   第三行由字符 "zxcvbnm" 组成。
 * 示例 1：
 *   输入：words = ["Hello","Alaska","Dad","Peace"]
 *   输出：["Alaska","Dad"]
 *
 * @author 刘学松
 * @date 2021/2/10 15:45
 */
public class 键盘行 {
    public static void main(String[] args) {
        String[] words = {"Hello", "Alaska", "Dad", "Peace"};
        for (String word : findWords(words)) {
            System.out.println(word);
        }
    }

    /**
     * 1ms 36.4MB
     * @param words
     * @return
     */
    public static String[] findWords(String[] words) {
        Map<Character, Integer> map = getCharMap();
        List<String> list = new ArrayList<String>();
        for (String word : words) {
            if (word == null || word.length() == 0) {
                continue;
            } else if (word.length() == 1) {
                list.add(word);
                continue;
            }
            String lowerCaseWord = word.toLowerCase();
            int lineNum = map.get(lowerCaseWord.charAt(0));
            for (int i = 1; i < word.length(); i++) {
                if ((map.get(lowerCaseWord.charAt(i)) != lineNum)) {
                    break;
                }
                if (i == word.length()-1) {
                    list.add(word);
                }
            }
        }
        return list.toArray(new String[list.size()]);
    }

    /**
     * 4ms 37.1MB
     * @param words
     * @return
     */
    public static String[] findWords1(String[] words) {
        List<String> list = new ArrayList<String>();
        String lowerCaseWord;
        for (String word : words) {
            lowerCaseWord = word.toLowerCase();
            if (lowerCaseWord.matches("[qwertyuiop]+") || lowerCaseWord.matches("[asdfghjkl]+") || lowerCaseWord.matches("[zxcvbnm]+")) {
                list.add(lowerCaseWord);
            }
        }
        return list.toArray(new String[list.size()]);
    }

    public static Map<Character, Integer> getCharMap() {
        Map<Character, Integer> map = new HashMap<>(64);
        map.put('q', 1);
        map.put('w', 1);
        map.put('e', 1);
        map.put('r', 1);
        map.put('t', 1);
        map.put('y', 1);
        map.put('u', 1);
        map.put('i', 1);
        map.put('o', 1);
        map.put('p', 1);

        map.put('a', 2);
        map.put('s', 2);
        map.put('d', 2);
        map.put('f', 2);
        map.put('g', 2);
        map.put('h', 2);
        map.put('j', 2);
        map.put('k', 2);
        map.put('l', 2);

        map.put('z', 3);
        map.put('x', 3);
        map.put('c', 3);
        map.put('v', 3);
        map.put('b', 3);
        map.put('n', 3);
        map.put('m', 3);

        return map;
    }
}
